Previous months’
reports
1. Summary
1.1 Summary table
A total of 686,429 persons have been reached by EiE activities in
2023, of which 358,117 were boys, 316,617 were girls, 5,675 were men and
6,020 were women. Below is a summary by indicator.
Summary statistics for EIE 5Ws reporting, 30 October 2023Indicator | Partners1 | Counties | October_reached | Total_reached | Target | %Target_reached |
|---|
1. Access ECD spaces/schools | 15 | 15 | 44,409 | 399,806 | 1,201,151 | 33.29 |
2. Feeding programmes | 10 | 8 | 0 | 148,393 | 784,647 | 18.91 |
3. Teaching materials | 13 | 13 | 20,687 | 237,438 | 600,578 | 39.53 |
4. Safe water, personal hygiene | 8 | 7 | 1,342 | 43,565 | 784,647 | 5.55 |
5. Educators resilience enhancing | 21 | 16 | 917 | 9,355 | 6,018 | 155.45 |
6. Children resilience enhancing | 14 | 15 | 35,220 | 128,875 | 154,729 | 83.29 |
7. Construction and rehabilitation | 2 | 2 | 1,167 | 35,899 | 0 | 100.00 |
Total | 41 | 20 | 80,546 | 686,4292 | 2,146,5452 | 31.98 |
1Only implementing partners |
2Only the sum of indicators 1, 2, 5 and 6 |
1.2 By sex and age

Only Indicator 6, Children benefiting from resilience-enhancing
programming, sees a higher proportion of females reached over men.

1.3 By county
48.1% of all beneficiaries reached originate from Turkana, though it
only has 14.05% of the targeted population.

IPC data extracted from here.
2. Progress by indicator
2.1.1 Overall progress
The rate of increase in the number of beneficiaries reached has yet
to plateau, with only indicators 2 and 6 seeing slight slowdowns in the
number of beneficiaries reached each month.
2.1.2 Reached by indicator

2.2.1 Access to ECD spaces/schools
EiE Indicator 1, as of 30 October 2023Indicator | Partners | Counties | October_reached | Total_reached | Target | %Target_reached |
|---|
1. Access ECD spaces/schools | 15 | 15 | 44,409 | 399,806 | 1,201,151 | 33.29 |

In October 2023, 44,409 persons were reached by interventions
contributing to this indicator, of which 26,874 were boys and 17,535
were girls.

2.2.2 School feeding programmes
EiE Indicator 2, as of 30 October 2023Indicator | Partners | Counties | October_reached | Total_reached | Target | %Target_reached |
|---|
2. Feeding programmes | 10 | 8 | 0 | 148,393 | 784,647 | 18.91 |

In October 2023, 0 persons were reached by interventions contributing
to this indicator, of which 0 were boys and 0 were girls.

2.2.3 Teaching and learning materials
EiE Indicator 3, as of 30 October 2023Indicator | Partners | Counties | October_reached | Total_reached | Target | %Target_reached |
|---|
3. Teaching materials | 13 | 13 | 20,687 | 237,438 | 600,578 | 39.53 |

In October 2023, 20,687 persons were reached by interventions
contributing to this indicator, of which 12,453 were boys, 8,234 were
girls, 0 were men and 0 were women.

2.2.4 Safe water, personal hygiene
EiE Indicator 4, as of 30 October 2023Indicator | Partners | Counties | October_reached | Total_reached | Target | %Target_reached |
|---|
4. Safe water, personal hygiene | 8 | 7 | 1,342 | 43,565 | 784,647 | 5.55 |

In October 2023, 1,342 persons were reached by interventions
contributing to this indicator, of which 638 were boys and 704 and were
girls.

2.2.5 Educators trained in resilience enhancing programmes
EiE Indicator 5, as of 30 October 2023Indicator | Partners | Counties | October_reached | Total_reached | Target | %Target_reached |
|---|
5. Educators resilience enhancing | 21 | 16 | 917 | 9,355 | 6,018 | 155.45 |

In October 2023, 917 persons were reached by interventions
contributing to this indicator, of which 369 were men and 548 and were
women.

2.2.6 Children benefited from resilience enhancing programmes
EiE Indicator 6, as of 30 October 2023Indicator | Partners | Counties | October_reached | Total_reached | Target | %Target_reached |
|---|
6. Children resilience enhancing | 14 | 15 | 35,220 | 128,875 | 154,729 | 83.29 |

In October 2023, 35,220 persons were reached by interventions
contributing to this indicator, of which 17,038 were boys and 18,182 and
were girls

2.2.7 Children benefited from construction and rehabilitation
EiE Indicator 7, as of 30 October 2023Indicator | Partners | Counties | October_reached | Total_reached | Target | %Target_reached |
|---|
7. Construction and rehabilitation | 2 | 2 | 1,167 | 35,899 | 0 | 100 |
To note: targets have not been set for indicator 7.

In October 2023, 1,167 persons were reached by interventions
contributing to this indicator, of which 0 were boys and 1,167 and were
girls

3. Partners
3.1 Operational presence of implementing partners
Below is an interactive table which adds detail to the map above,
serving additional information for coordination – allowing interested
parties to search by county or partner.
The column #Activities refers to the number of Education
activities implemented by said partner in each county. Each column can
be sorted with the arrows next to each column name. Each column can also
be filtered by typing into the search bar below each column name. Only
completed activities have been included.
Download the dataset from the table below here.
3.2 Summary by implementing partner
The table below breaks down persons reached by partner.
Summary by implementing partnerimplementing_partner | reached1 | counties | activities | %total2 |
|---|
Finn Church Aid | 459,740 | 5 | 7 | 45.82 |
Women Educational Researchers of Kenya | 74,920 | 5 | 3 | 7.47 |
Food for the Hungry | 57,729 | 2 | 6 | 5.75 |
Windle International | 57,307 | 1 | 3 | 5.71 |
Norwegian Refugee Council | 52,914 | 2 | 3 | 5.27 |
Save the Children | 38,805 | 4 | 3 | 3.87 |
Lifeskills Promoters | 38,416 | 3 | 5 | 3.83 |
World Vision Kenya | 35,584 | 6 | 6 | 3.55 |
UNICEF | 34,732 | 2 | 1 | 3.46 |
Jesuit Refugee Service | 33,605 | 1 | 3 | 3.35 |
Feed the Children | 28,711 | 3 | 1 | 2.86 |
Homa Bay County | 23,166 | 1 | 1 | 2.31 |
We World | 20,947 | 2 | 1 | 2.09 |
AVSI Foundation | 9,768 | 2 | 3 | 0.97 |
Ministry of Education | 8,294 | 2 | 2 | 0.83 |
Nawiri Children Development Program | 6,652 | 5 | 2 | 0.66 |
Edukans | 4,734 | 1 | 1 | 0.47 |
Action for Sustainable Change | 4,160 | 1 | 3 | 0.41 |
Special Olympics Kenya | 2,284 | 3 | 3 | 0.23 |
Mondi | 2,197 | 1 | 1 | 0.22 |
Qatar Charity | 1,541 | 1 | 1 | 0.15 |
The Girl Child Network | 1,050 | 2 | 1 | 0.10 |
Frontiers Community Development Organization | 1,044 | 1 | 1 | 0.10 |
Tana North and Tana Delta | 882 | 1 | 1 | 0.09 |
Bartabwa | 849 | 1 | 1 | 0.08 |
County Director of Education Mandera | 600 | 1 | 2 | 0.06 |
Missionary Sisters of the Catechism | 585 | 1 | 1 | 0.06 |
Evangelizing Sisters of Mary | 458 | 1 | 4 | 0.05 |
County Director of Education Wajir | 409 | 1 | 2 | 0.04 |
SMB | 270 | 1 | 1 | 0.03 |
MoE, KNATCOM, STEM Impact Centre | 260 | 2 | 1 | 0.03 |
ERIKs Development Partner | 249 | 1 | 1 | 0.02 |
Servants of the Poor | 202 | 1 | 1 | 0.02 |
Dignitas | 135 | 1 | 1 | 0.01 |
MOE/TSC | 60 | 1 | 1 | 0.01 |
Voluntary Service Overseas | 42 | 1 | 1 | 0.00 |
Futebol da Forcaa | 20 | 1 | 1 | 0.00 |
IWS | 10 | 1 | 2 | 0.00 |
1All indicators as opposed only indicators 1, 2, 5 and 6 |
2Percentage of reached for all indicators |
3.3 Summary by lead_organisation
Summary by lead organisationlead_organisation | reached1 | counties | activities | %total2 |
|---|
UNICEF | 407,438 | 14 | 6 | 40.61 |
Finn Church Aid | 278,555 | 3 | 5 | 27.76 |
Food for the Hungry | 57,729 | 2 | 6 | 5.75 |
World Vision Kenya | 46,931 | 7 | 6 | 4.68 |
Jesuit Refugee Service | 33,605 | 1 | 3 | 3.35 |
Save the Children | 29,323 | 4 | 3 | 2.92 |
Feed the Children | 28,711 | 3 | 1 | 2.86 |
Lifeskills Promoters | 26,410 | 2 | 4 | 2.63 |
Population Council | 23,166 | 1 | 1 | 2.31 |
We World | 20,947 | 2 | 1 | 2.09 |
Windle International | 18,687 | 1 | 1 | 1.86 |
AVSI Foundation | 10,623 | 5 | 6 | 1.06 |
ChildFund Kenya | 7,696 | 5 | 2 | 0.77 |
Edukans | 4,734 | 1 | 1 | 0.47 |
Action for Sustainable Change | 4,160 | 1 | 3 | 0.41 |
Qatar Charity | 1,541 | 1 | 1 | 0.15 |
UNESCO | 1,330 | 3 | 3 | 0.13 |
Missionary Sisters of the Catechism | 500 | 1 | 1 | 0.05 |
Special Olympics Kenya | 423 | 2 | 1 | 0.04 |
Voluntary Service Overseas | 291 | 2 | 1 | 0.03 |
Dignitas | 135 | 1 | 1 | 0.01 |
SMB | 135 | 1 | 1 | 0.01 |
KENYA NATIONAL COMMISSION FOR UNESCO | 115 | 1 | 2 | 0.01 |
Life Skills Promoters | 111 | 1 | 2 | 0.01 |
Evangelizing Sisters of Mary | 35 | 1 | 1 | 0.00 |
1All indicators as opposed only indicators 1, 2, 5 and 6 |
2Percentage of reached for all indicators |
4. Schools and education level
4.1 Schools
The number of schools reached by school feeding programmes and WASH
in schools interventions to-date are:

However, reporting the overall number of schools reached by all EiE
interventions is much more challenging.
Whilst all partners working on indicators 2 and 4 submitted the
number of schools they were working in, the same is not true for the
other indicators. Only indicators 2 and 4 require the reporting of the
number of schools.
5. Reference maps and tables
5.1 Reference maps
IPC data extracted from here.

5.2 Reference table
Download the EiE 5Ws data here
As a refresher for the reference table below, the indicators are:
indicator |
|---|
indicator 1 # of children and youth accessing ECD spaces/schools in drought affected areas |
indicator 2 # of schools/ECD spaces with feeding programmes |
indicator 3 # of learners and teachers reached with learning and teaching materials |
indicator 4 # of schools with adequate quantities of safe water for drinking and personal hygiene |
indicator 5 # of teachers / educators trained on resilience enhancing programmes (MHPSS, DRR & Life Skills, etc) |
indicator 5.1 # of teachers trained on any programme, including resilience |
indicator 5.2 # of BoM trained on any programme, including resilience |
indicator 5.3 # of government officials trained on any programme, including resilience |
indicator 6 # of children and youth benefiting from resilience enhancing programmes (MHPSS, DRR & Life Skills, etc) |
indicator 7 # of children benefitting from child-friendly environment (any construction or rehabilitation) |
LS0tDQp0aXRsZTogIktlbnlhIEVkdWNhdGlvbiBpbiBFbWVyZ2VuY2llcyBXb3JraW5nIEdyb3VwIC0tIERyb3VnaHQgNVdzIFJlcG9ydCINCmRhdGU6ICAiMzAgT2N0b2JlciAyMDIzIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHRoZW1lOiByZWFkYWJsZQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vDQogICAgY29sbGFwc2VkOiBubw0KYWx3YXlzX2FsbG93X2h0bWw6IHllcw0KcGFyYW1zOiANCiAgcmVwb3J0X2RhdGU6ICIzMCBPY3RvYmVyIDIwMjMiDQogIHJlcG9ydF9tb250aDogIk9jdG9iZXIiDQotLS0NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBoZWlnaHQ6IDUwcHg7DQogIG1hcmdpbjogMmVtIDIwcHggNDBweCAyMHB4Ow0KICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9rZW55YS1laWUtd2cvZWllX3dnXzV3cy9tYWluL2VpZV93Z19sb2dvLnBuZyIpOw0KICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47DQogIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7DQogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQp9DQpgYGANCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KICAgIGJvZHkgLm1haW4tY29udGFpbmVyIHsNCiAgICAgICAgbWF4LXdpZHRoOiAxMjgwcHg7DQogICAgfQ0KPC9zdHlsZT4NCmBgYA0KDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCBmaWcud2lkdGg9OSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShzdHJpbmdpKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KHZpcmlkaXMpDQpsaWJyYXJ5KHBhdGNod29yaykNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGhlcmUpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGZsZXh0YWJsZSkNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoYW55dGltZSkNCmxpYnJhcnkodGlkeXRleHQpDQpsaWJyYXJ5KGdnc2ZsYWJlbCkNCg0KdGhlbWVfc2V0KHRoZW1lX2xpZ2h0KCkpDQoNCiMgSW5zdGFsbGF0aW9uIG9mIG1kZXByaXYgcGFja2FnZQ0KIyBpbnN0YWxsIHBhY2thZ2UgZGV2dG9vbHMgaWYgbm90IHlldCBpbnN0YWxsZWQNCiMgICBpbnN0YWxsLnBhY2thZ2VzKCJkZXZ0b29scyIpDQoNCiMgaW5zdGFsbCBmYXN0IGZyb20gR2l0SHViIHdpdGhvdXQgdmlnbmV0dGVzIA0KIyAgIGRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigiYS1iZW5pbmkvbWRlcHJpdiIsIGJ1aWxkX3ZpZ25ldHRlcyA9IEZBTFNFDQoNCiMgQWx0ZXJuYXRpdmVseSwgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgaGVyZTogaHR0cHM6Ly9hLWJlbmluaS5naXRodWIuaW8vbWRlcHJpdi8NCg0KIyBkaXNhYmxpbmcgc2NpZW50aWZpYyBub3RhdGlvbg0Kb3B0aW9ucyhzY2lwZW4gPSAxMDApDQoNCmAlb3V0JWAgPC0gTmVnYXRlKGAlaW4lYCkNCg0KIyBmdW5jdGlvbiBmb3IgdHJhbnNwb3NpbmcgZGYNCnRyYW5zcG9zZV9kZiA8LSBmdW5jdGlvbihkZikgew0KICB0X2RmIDwtIGRhdGEudGFibGU6OnRyYW5zcG9zZShkZikNCiAgY29sbmFtZXModF9kZikgPC0gcm93bmFtZXMoZGYpDQogIHJvd25hbWVzKHRfZGYpIDwtIGNvbG5hbWVzKGRmKQ0KICB0X2RmIDwtIHRfZGYgJT4lDQogICAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oLmRhdGEgPSAuKSAlPiUNCiAgICB0aWJibGU6OmFzX3RpYmJsZSguKQ0KICByZXR1cm4odF9kZikNCn0NCg0KIyBzY2FsaW5nIGZ1bmN0aW9ucyANCnJhbmdlMDEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgpKS8obWF4KHgpLW1pbih4KSl9DQpyYW5nZV93bmEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgsIG5hLnJtID0gVFJVRSkpLyhtYXgoeCwgbmEucm0gPSBUUlVFKS1taW4oeCwgbmEucm0gPSBUUlVFKSl9DQoNCiMgbW9kZSBmdW5jdGlvbiANCm1vZGUgPC0gZnVuY3Rpb24oeCkgew0KICB1eCA8LSB1bmlxdWUoeCkNCiAgdXhbd2hpY2gubWF4KHRhYnVsYXRlKG1hdGNoKHgsIHV4KSkpXQ0KfQ0KDQojIEZpeGluZyBkYXRlcw0KbmFtZV90b19kYXRlIDwtIGZ1bmN0aW9uKHgpIHsNCiAgbHVicmlkYXRlOjptZHkoaWZlbHNlKHggJWluJSBjKG1vbnRoLm5hbWUsIG1vbnRoLmFiYiksIHBhc3RlMCh4LCAiLzAxLzIwMjMiKSwgeCkpDQp9DQpgYGANCg0KDQoNCg0KYGBge3IgZGF0YX0NCiMgUnVuIHRoaXMgaWYgeW91IG5lZWQgdG8NCiMgcm1hcmtkb3duOjpyZW5kZXIoaW5wdXQgPSAiNVdzX2NsZWFuaW5nX3NjcmlwdC5SbWQiKQ0KDQpsb2NhdGlvbnMgPC0gcmVhZF94bHN4KCIuL2RhdGEva2VuX2FkbWluYm91bmRhcmllc190YWJ1bGFyZGF0YS54bHN4IiwgDQogICAgICAgICAgICAgICAgICAgICAgc2hlZXQgPSAiQURNMiIpICU+JSANCiAgY2xlYW5fbmFtZXMoKQ0KDQpzaXRyZXBfdGFibGUgPC0gcmVhZF94bHN4KCIuL2RhdGEvc2l0cmVwX3Jlc3VsdHNfdGFibGUueGxzeCIpICU+JSANCiAgY2xlYW5fbmFtZXMoKQ0KDQp0YXJnZXRzIDwtIHJlYWRfY3N2KCIuL2RhdGEvZWllX3RhcmdldHMuY3N2IikNCg0KcGNvZGUxX3NoYXBlIDwtIA0KICBzZjo6c3RfcmVhZCgiLi9kYXRhL2tlbl9hZG1faWViY18yMDE5MTAzMV9zaHAva2VuX2FkbWJuZGFfYWRtMV9pZWJjXzIwMTkxMDMxLnNocCIsIA0KICAgICAgICAgIHF1aWV0ID0gVFJVRSkgJT4lIA0KICBjbGVhbl9uYW1lcygpDQoNCmlwYyA8LSByZWFkX2NzdigiLi9kYXRhL2lwYy5jc3YiKQ0KDQpwYXJ0bmVyX2xpc3RfY291bnRpZXMgPC0gcmVhZF9jc3YoIi4vZGF0YS9wYXJ0bmVyX2xpc3RfY291bnRpZXMuY3N2IikgJT4lIA0KICBmaWx0ZXIocGFydG5lcl90eXBlID09ICJpbXBsZW1lbnRpbmdfcGFydG5lciIpDQoNCmVpZSA8LSByZWFkX2NzdigiLi9kYXRhL2VpZV81d3MuY3N2IikgJT4lIA0KICAjIGZpbHRlcighaXMubmEoaW5kaWNhdG9yX3Nob3J0KSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QoYm95cyA9IDAsIGdpcmxzID0gMCwgbWVuID0gMCwgd29tZW4gPSAwKSkgJT4lIA0KICAjIFRvdGFsIHJlYWNoZWQgb2YgaW5kaWNhdG9yIDEgaXMgb25seSBib3lzIGFuZCBnaXJscyANCiAgbXV0YXRlKHRvdGFsX3JlYWNoZWQgPSBjYXNlX3doZW4oDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3IsICJjaGlsZHJlbiBhbmQgeW91dGggYWNjZXNzaW5nIEVDRCBzcGFjZXMvc2Nob29scyBpbiBkcm91Z2h0IGFmZmVjdGVkIGFyZWFzIikgfiANCiAgICAgIGJveXMgKyBnaXJscywNCiAgICBzdHJfZGV0ZWN0KGluZGljYXRvciwgIjUgI3w1LjF8NS4yfDUuMyIpIH4gbWVuICsgd29tZW4sDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3IsICJjaGlsZHJlbiBhbmQgeW91dGggYmVuZWZpdGluZyBmcm9tIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMiKSB+IGJveXMgKyBnaXJscywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiB0b3RhbF9yZWFjaGVkKSkgJT4lIA0KICBmaWx0ZXIobW9udGggJW91dCUgYygiTm92ZW1iZXIiLCAiRGVjZW1iZXIiKSkNCmBgYA0KDQoNCltQcmV2aW91cyBtb250aHMnIHJlcG9ydHNdKGh0dHBzOi8va2VueWEtZWllLXdnLmdpdGh1Yi5pby8pIA0KDQo8YnI+PGJyPjxicj4NCg0KIyAxLiBTdW1tYXJ5DQoNCiMjIDEuMSBTdW1tYXJ5IHRhYmxlDQoNCmBgYHtyfQ0Kc3VtX3N0YXRzIDwtIGVpZSAlPiUgIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSwgDQogICAgICAgICAgICBjb3VudGllcyA9IG5fZGlzdGluY3QoY291bnR5KSwgDQogICAgICAgICAgICByZWFjaGVkID0gc3VtKHNlY3Rvcl9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIG1lbiA9IHN1bShtZW5bc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyfDUiKSAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgd29tZW4gPSBzdW0od29tZW5bc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyfDUiKSAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgYm95cyA9IHN1bShib3lzW3N0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMXwyfDYiKSAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGdpcmxzID0gc3VtKGdpcmxzW3N0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMXwyfDYiKSAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIHJlYWNoZWRfMTI1NiA9IHN1bSh0b3RhbF9yZWFjaGVkW3N0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMXwyfDV8NiIpICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgbGF0ZXN0X3JlYWNoZWQgPSBzdW0odG90YWxfcmVhY2hlZFtzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjF8Mnw1fDYiKSAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCImIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aF0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCg0KDQoNCmBgYA0KDQpBIHRvdGFsIG9mIGByIHN1bV9zdGF0cyAlPiUgcHVsbChyZWFjaGVkXzEyNTYpICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIGhhdmUgYmVlbiByZWFjaGVkIGJ5IEVpRSBhY3Rpdml0aWVzIGluIDIwMjMsIG9mIHdoaWNoIGByIHN1bV9zdGF0cyAlPiUgcHVsbChib3lzKSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBib3lzLCBgciBzdW1fc3RhdHMgJT4lIHB1bGwoZ2lybHMpICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGdpcmxzLCBgciBzdW1fc3RhdHMgJT4lIHB1bGwobWVuKSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBtZW4gYW5kIGByIHN1bV9zdGF0cyAlPiUgcHVsbCh3b21lbikgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgd29tZW4uIEJlbG93IGlzIGEgc3VtbWFyeSBieSBpbmRpY2F0b3IuIA0KDQoNCg0KPGJyPg0KDQoNCmBgYHtyfQ0KDQoNCnN1bW1hcnlfdGFibGUgPC0gZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBtdXRhdGUobGF0ZXN0X3JlYWNoZWQgPSBpZmVsc2UobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoLCB0b3RhbF9yZWFjaGVkLCBOQV9pbnRlZ2VyXykpICU+JSANCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpLCANCiAgICAgICAgICAgIGNvdW50aWVzID0gbl9kaXN0aW5jdChhZG0xX3Bjb2RlKSwgICANCiAgICAgICAgICAgIGxhdGVzdF9yZWFjaGVkID0gc3VtKGxhdGVzdF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIHRvdGFsX3JlYWNoZWQgPSBzdW0odG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBhZG9ybl90b3RhbHMoInJvdyIsLCwsIGxhdGVzdF9yZWFjaGVkLCB0b3RhbF9yZWFjaGVkKSAlPiUgDQogIG11dGF0ZShwYXJ0bmVycyA9IGlmZWxzZShpbmRpY2F0b3Jfc2hvcnQgPT0gIlRvdGFsIiwgc3VtX3N0YXRzJHBhcnRuZXJzLCBwYXJ0bmVycyksIA0KICAgICAgICAgY291bnRpZXMgPSBpZmVsc2UoaW5kaWNhdG9yX3Nob3J0ID09ICJUb3RhbCIsIHN1bV9zdGF0cyRjb3VudGllcywgY291bnRpZXMpLCANCiAgICAgICAgIHRvdGFsX3JlYWNoZWQgPSBpZmVsc2UoaW5kaWNhdG9yX3Nob3J0ID09ICJUb3RhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1fc3RhdHMkcmVhY2hlZF8xMjU2LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfcmVhY2hlZCksIA0KICAgICAgICAgbGF0ZXN0X3JlYWNoZWQgPSBpZmVsc2UoaW5kaWNhdG9yX3Nob3J0ID09ICJUb3RhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtX3N0YXRzJGxhdGVzdF9yZWFjaGVkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdF9yZWFjaGVkKSkgJT4lIA0KICBsZWZ0X2pvaW4odGFyZ2V0cyAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcih0YXJnZXRfdW5pdCA9PSAicGVvcGxlIikgJT4lDQogICAgICAgICAgICAgIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCkgJT4lDQogICAgICAgICAgICAgIHN1bW1hcmlzZSh0YXJnZXQgPSBzdW0oY291bnR5X3RhcmdldCkpLCANCiAgICAgICAgICAgIGJ5ID0gImluZGljYXRvcl9zaG9ydCIpICU+JSANCiAgZmlsdGVyKCFpcy5uYShpbmRpY2F0b3Jfc2hvcnQpKSAlPiUgDQogIG11dGF0ZSh0YXJnZXQgPSBpZmVsc2UoaW5kaWNhdG9yX3Nob3J0ID09ICJUb3RhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldHMgJT4lIGRpc3RpbmN0KGNvdW50eSwgY291bnR5X292ZXJhbGxfdGFyZ2V0KSAlPiUge3N1bSguJGNvdW50eV9vdmVyYWxsX3RhcmdldCl9LCANCiAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQpLCANCiAgICAgICAgIHRhcmdldCA9IGlmZWxzZShpcy5uYSh0YXJnZXQpLCAwLCB0YXJnZXQpKSAlPiUgDQogIG11dGF0ZShwYyA9IHJvdW5kKHRvdGFsX3JlYWNoZWQgLyB0YXJnZXQgKiAxMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIHBjID0gaWZlbHNlKGlzLmluZmluaXRlKHBjKSwgMTAwLCBwYykpICU+JQ0KICBzZWxlY3QoaW5kaWNhdG9yID0gaW5kaWNhdG9yX3Nob3J0LCBwYXJ0bmVycywgY291bnRpZXMsIA0KICAgICAgICAgbGF0ZXN0X3JlYWNoZWQsIHRvdGFsX3JlYWNoZWQsIHRhcmdldCwgYCV0YXJnZXRfcmVhY2hlZGAgPSBwYykgJT4lDQogIHNlbGVjdF9hbGwofiBnc3ViKCJsYXRlc3QiLCANCiAgICAgICAgICAgICAgICAgICAgcGFyYW1zJHJlcG9ydF9tb250aCwgLikpICU+JQ0KICBzZWxlY3RfYWxsKH4gc3RyX3RvX3RpdGxlKC4pKSAgDQoNCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIlN1bW1hcnkgc3RhdGlzdGljcyBmb3IgRUlFIDVXcyByZXBvcnRpbmcsICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSkpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45OSkgJT4lIA0KICBmb250c2l6ZShpID0gMTo3LCBqID0gMSwgc2l6ZSA9IDkpICU+JSANCiAgZm9udHNpemUoc2l6ZSA9IDksIHBhcnQgPSAiaGVhZGVyIikgJT4lIA0KICBmb290bm90ZShpID0gMSwgaiA9IDIsIHBhcnQgPSAiaGVhZGVyIiwgcmVmX3N5bWJvbHMgPSAiMSIsIA0KICAgICAgICAgICBhc19wYXJhZ3JhcGgoIk9ubHkgaW1wbGVtZW50aW5nIHBhcnRuZXJzIikpICU+JSANCiAgZm9vdG5vdGUoaSA9IDgsIGogPSA1OjYsIHJlZl9zeW1ib2xzID0gIjIiLCANCiAgICAgICAgICAgYXNfcGFyYWdyYXBoKCJPbmx5IHRoZSBzdW0gb2YgaW5kaWNhdG9ycyAxLCAyLCA1IGFuZCA2IikpDQoNCiAgDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCg0KIyMgMS4yIEJ5IHNleCBhbmQgYWdlDQoNCmBgYHtyfQ0KZWllICU+JSANCiAgbXV0YXRlKGluZGljYXRvcl9zaG9ydCA9IGZjdF9yZXYoaW5kaWNhdG9yX3Nob3J0KSkgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGJveXMsIGdpcmxzLCBtZW4sIHdvbWVuKSwgfiByZXBsYWNlX25hKC4sIDApKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKG1lbiwgd29tZW4pLCB+IGlmZWxzZShzdHJfZGV0ZWN0KGluZGljYXRvciwgIjEiKSwgMCwgLikpICU+JSANCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIHN1bW1hcmlzZV9hdCh2YXJzKGJveXMsIGdpcmxzLCBtZW4sIHdvbWVuKSwgfiBzdW0oLiwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBtdXRhdGUodG90YWxfcmVhY2hlZCA9IGJveXMgKyBnaXJscyArIG1lbiArIHdvbWVuLCANCiAgICAgICAgIGZlbWFsZSA9ICh3b21lbiArIGdpcmxzKSAvIHRvdGFsX3JlYWNoZWQsIA0KICAgICAgICAgbWFsZSA9IChib3lzICsgbWVuKSAvIHRvdGFsX3JlYWNoZWQpICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoZmVtYWxlLCBtYWxlKSwgDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJzZXgiLCANCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJwYyIpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcGMsIHkgPSBpbmRpY2F0b3Jfc2hvcnQsIGZpbGwgPSBzZXgpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIGdlb21fdGV4dChhZXMoeCA9IHBjLCANCiAgICAgICAgICAgICAgICB5ID0gaW5kaWNhdG9yX3Nob3J0LCANCiAgICAgICAgICAgICAgICBsYWJlbCA9IHBlcmNlbnQocGMsIGFjY3VyYWN5ID0gMSkpLA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IC41KSwgDQogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiM0NDM5ODMiLCAiIzM1Yjc3OSIpKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50KSArIA0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJTZXggYnJlYWtkb3duIGJ5IGluZGljYXRvciIpICANCg0KYGBgDQoNCjxicj4NCg0KT25seSBJbmRpY2F0b3IgNiwgQ2hpbGRyZW4gYmVuZWZpdGluZyBmcm9tIHJlc2lsaWVuY2UtZW5oYW5jaW5nIHByb2dyYW1taW5nLCBzZWVzIGEgaGlnaGVyIHByb3BvcnRpb24gb2YgZmVtYWxlcyByZWFjaGVkIG92ZXIgbWVuLiANCg0KPGJyPg0KDQpgYGB7ciBmaWcuaGVpZ2h0PTZ9DQplaWUgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGJveXMsIGdpcmxzLCBtZW4sIHdvbWVuKSwgfiByZXBsYWNlX25hKC4sIDApKSAlPiUNCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIHN1bW1hcmlzZV9hdCh2YXJzKG1lbiwgd29tZW4sIGJveXMsIGdpcmxzKSwgfiBzdW0oLikpICU+JSANCiAgZmlsdGVyKCFpcy5uYShpbmRpY2F0b3Jfc2hvcnQpKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhtZW4sIHdvbWVuLCBib3lzLCBnaXJscyksIA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAidHlwZSIsIA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInJlYWNoZWQiKSAlPiUgDQogIG11dGF0ZSh0eXBlID0gc3RyX3RvX3RpdGxlKHR5cGUpLCANCiAgICAgICAgIHR5cGUgPSBmY3RfcmVsZXZlbCh0eXBlLCBjKCJNZW4iLCAiV29tZW4iLCAiQm95cyIsICJHaXJscyIpKSkgJT4lIA0KICAjIFlvdSdyZSBqdXN0IGZpbHRlcmluZyB0aGVtIG91dCBtYW51YWxseQ0KICBtdXRhdGUocmVhY2hlZCA9IGNhc2Vfd2hlbigNCiAgICBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjUiKSAmIHR5cGUgPT0gIkJveXMiIH4gMCwgDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI1IikgJiB0eXBlID09ICJHaXJscyIgfiAwLCANCiAgICBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjYiKSAmIHR5cGUgPT0gIk1lbiIgfiAwLCANCiAgICBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjYiKSAmIHR5cGUgPT0gIldvbWVuIiB+IDAsIA0KICAgIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMSIpICYgdHlwZSA9PSAiTWVuIiB+IDAsIA0KICAgIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMSIpICYgdHlwZSA9PSAiV29tZW4iIH4gMCwNCiAgICBUUlVFIH4gcmVhY2hlZA0KICApKSAlPiUgDQogIGdncGxvdChhZXMoeSA9IHR5cGUsIHggPSByZWFjaGVkLCBmaWxsID0gdHlwZSkpICsgDQogIGdlb21fY29sKCkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKHJlYWNoZWQpKSwgDQogICAgICAgICAgICBoanVzdCA9ICJpbndhcmQiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgZmFjZSA9ICJib2xkIiksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMjEyMTIxIiksIA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IG51bWJlcl9mb3JtYXQoc2NhbGUgPSAxIC8gMTAwMCwgc3VmZml4ID0gIksiKSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfZChiZWdpbiA9IC4yLCBlbmQgPSAuOSkgKyANCiAgZmFjZXRfd3JhcCh+IGluZGljYXRvcl9zaG9ydCwgc2NhbGVzID0gImZyZWVfeCIpICsgDQogIGxhYnMoeCA9ICJQZXJzb25zIHJlYWNoZWQiLCANCiAgICAgICB5ID0gIiIsIA0KICAgICAgIHRpdGxlID0gIlJlYWNoIGRpc2FnZ3JlZ2F0ZWQgYnkgc2V4LCBhZ2UgYW5kIGluZGljYXRvciIpDQoNCg0KYGBgDQoNCg0KDQo8YnI+PGJyPjxicj4NCg0KDQojIyAxLjMgQnkgY291bnR5DQoNCmBgYHtyfQ0KY3VtX3BjPC0gZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieShjb3VudHkpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oc2VjdG9yX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgbGVmdF9qb2luKHRhcmdldHMgJT4lIA0KICAgICAgICAgICAgICBkaXN0aW5jdChjb3VudHksIHRhcmdldCA9IGNvdW50eV9vdmVyYWxsX3RhcmdldCksIA0KICAgICAgICAgICAgYnkgPSAiY291bnR5IikgJT4lIA0KICByZXBsYWNlX25hKGxpc3QodGFyZ2V0ID0gMCkpICU+JSANCiAgbXV0YXRlKHBjX2JlbiA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIHBjX3RhcmdldCA9IHJvdW5kKHRhcmdldCAvIHN1bSh0YXJnZXQpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKGN1bV9wYyA9IGN1bXN1bShwY19iZW4pKQ0KYGBgDQoNCmByIGN1bV9wYyAlPiUgZmlsdGVyKGNvdW50eSA9PSAiVHVya2FuYSIpICU+JSBwdWxsKGN1bV9wYylgJSBvZiBhbGwgYmVuZWZpY2lhcmllcyByZWFjaGVkIG9yaWdpbmF0ZSBmcm9tIFR1cmthbmEsIHRob3VnaCBpdCBvbmx5IGhhcyBgciBjdW1fcGMgJT4lIGZpbHRlcihjb3VudHkgPT0gIlR1cmthbmEiKSAlPiUgcHVsbChwY190YXJnZXQpYCUgb2YgdGhlIHRhcmdldGVkIHBvcHVsYXRpb24uIA0KDQo8YnI+DQoNCmBgYHtyfQ0KDQplaWUgJT4lIA0KICBncm91cF9ieShhZG0xX3Bjb2RlLCBjb3VudHkpICU+JSANCiAgc3VtbWFyaXNlKHNlY3Rvcl9yZWFjaGVkID0gc3VtKHNlY3Rvcl9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgbGVmdF9qb2luKHRhcmdldHMgJT4lIA0KICAgICAgICAgICAgICBkaXN0aW5jdChjb3VudHksIHRhcmdldCA9IGNvdW50eV9vdmVyYWxsX3RhcmdldCksIA0KICAgICAgICAgICAgYnkgPSAiY291bnR5IikgJT4lICANCiAgbXV0YXRlKGNvdW50eSA9IGZjdF9yZW9yZGVyKGNvdW50eSwgc2VjdG9yX3JlYWNoZWQpKSAlPiUgDQogIGZpbHRlcihzZWN0b3JfcmVhY2hlZCA+IDAgfCB0YXJnZXQgPiAwKSAlPiUgDQogIGxlZnRfam9pbihpcGMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYWRtMV9wY29kZSwgcGVyY2VudF9waGFzZV9wMyksIA0KICAgICAgICAgICAgYnkgPSAiYWRtMV9wY29kZSIpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHNlY3Rvcl9yZWFjaGVkLCB0YXJnZXQpLCANCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInR5cGUiLCANCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSANCiAgbXV0YXRlKHR5cGUgPSBpZmVsc2UodHlwZSA9PSAidGFyZ2V0IiwgIkNvdW50eSBUYXJnZXQiLCAiU2VjdG9yIFJlYWNoZWQiKSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QodmFsdWUgPSAwKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IHZhbHVlLCANCiAgICAgICAgICAgICB5ID0gY291bnR5LCANCiAgICAgICAgICAgICBmaWxsID0gcGVyY2VudF9waGFzZV9wMykpICsgDQogIGdlb21fY29sKCkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKHZhbHVlKSksIGhqdXN0ID0gImlud2FyZCIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IG51bWJlcl9mb3JtYXQoc2NhbGUgPSAxLzEwMDAsIHN1ZmZpeCA9ICJLIikpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJpbmZlcm5vIiwgYmVnaW4gPSAuNCwgLCBkaXJlY3Rpb24gPSAtMSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBwZXJjZW50KSArIA0KICBmYWNldF9ncmlkKH4gdHlwZSwgc2NhbGVzID0gImZyZWVfeCIsIHNwYWNlID0gImZyZWUiKSArIA0KICBsYWJzKGZpbGwgPSAiJSBJUEMzKyIsDQogICAgICAgeCA9ICJUYXJnZXQvcmVhY2hlZCIsIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgY2FwdGlvbiA9ICJDb2xvdXJzIHJlZmVyIHRvICUgb2YgY291bnR5IHBvcHVsYXRpb24gaW4gSVBDIHBoYXNlIDMgb3IgYWJvdmUuIEhvbWEgQmF5IHdhcyBub3QgYXNzZXNzZWQgYXMgcGFydCBvZiB0aGUgSVBDIENsYXNzaWZpY2F0aW9uIiwgDQogICAgICAgdGl0bGUgPSAiQ29tcGFyaXNvbiBiZXR3ZWVuIHRhcmdldHMgYW5kIHJlYWNoZWQiKSArDQogIHRoZW1lKCMgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUsIGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwgDQogICAgICAgICMgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpLCANCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgZmFjZSA9ICJib2xkIiksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMjEyMTIxIiksIA0KICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSkpDQpgYGANCg0KSVBDIGRhdGEgZXh0cmFjdGVkIGZyb20gW2hlcmVdKGh0dHBzOi8vd3d3LmlwY2luZm8ub3JnL2lwYy1jb3VudHJ5LWFuYWx5c2lzL2RldGFpbHMtbWFwL2VuL2MvMTE1NjIxMC8/aXNvMz1LRU4pLg0KDQo8YnI+PGJyPjxicj4NCg0KDQoNCiMgMi4gUHJvZ3Jlc3MgYnkgaW5kaWNhdG9yDQoNCjxicj4NCg0KIyMgMi4xLjEgT3ZlcmFsbCBwcm9ncmVzcw0KDQoNCg0KYGBge3IgZmlnLmhlaWdodD02fQ0KDQpsaW5lX3ZhbHVlcyA8LSBlaWUgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKQ0KDQoNCmVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgbXV0YXRlKGRhdGUgPSBuYW1lX3RvX2RhdGUobW9udGgpKSAlPiUgDQogIGdyb3VwX2J5KGRhdGUsIGluZGljYXRvcl9zaG9ydCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCkgJT4lIA0KICBhcnJhbmdlKGRhdGUpICU+JSANCiAgbXV0YXRlKGN1bV9iZW4gPSBjdW1zdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgYXJyYW5nZShpbmRpY2F0b3Jfc2hvcnQpICU+JSAgDQogIGdncGxvdChhZXMoeCA9IGRhdGUsIHkgPSBjdW1fYmVuLCBjb2xvdXIgPSBpbmRpY2F0b3Jfc2hvcnQpKSArIA0KICAjIGdlb21fc21vb3RoKHNpemUgPSAxLCBhbHBoYSA9IC4zLCBzcGFuID0gLjUsIGxpbmV0eXBlID0gMCkgKw0KICBzdGF0X3Ntb290aChnZW9tID0gImxpbmUiLCBhcGhhID0gLjMsIHNwYW4gPSAuNSkgKyANCiAgZ2VvbV9wb2ludCgpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShiZW5lZmljaWFyaWVzKSksIA0KICAgICAgICAgICAgeCA9IC1JbmYsIHkgPSBJbmYsIGhqdXN0ID0gLTAuMTUsIHZqdXN0ID0gMC45LCBkYXRhID0gbGluZV92YWx1ZXMpICsgDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIiwgZGF0ZV9sYWJlbHMgPSAiJWIiKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsgDQogIGZhY2V0X3dyYXAofmluZGljYXRvcl9zaG9ydCwgc2NhbGVzID0gImZyZWVfeSIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYsIGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwgDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYsIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzIxMjEyMSIpLCANCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSArIA0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICJDdW11bGF0aXZlIGludGVydmVudGlvbnMiLCANCiAgICAgICB0aXRsZSA9IHBhc3RlMCgiTW9udGhseSBwcm9ncmVzcyBieSBhY3Rpdml0eSwgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSwNCiAgICAgICBzdWJ0aXRsZSA9ICJJbmRpY2F0b3Igc3VidG90YWwgaW4gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiBlYWNoIGZhY2V0IikgDQogIA0KDQoNCmBgYA0KPGJyPg0KDQpUaGUgcmF0ZSBvZiBpbmNyZWFzZSBpbiB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBoYXMgeWV0IHRvIHBsYXRlYXUsIHdpdGggb25seSBpbmRpY2F0b3JzIDIgYW5kIDYgc2VlaW5nIHNsaWdodCBzbG93ZG93bnMgaW4gdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgZWFjaCBtb250aC4gDQoNCjxicj48YnI+PGJyPg0KDQoNCiMjIDIuMS4yIFJlYWNoZWQgYnkgaW5kaWNhdG9yDQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIHN1bW1hcmlzZShyZWFjaGVkID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcmVhY2hlZCwgeSA9IGZjdF9yZXYoaW5kaWNhdG9yX3Nob3J0KSkpICsgDQogIGdlb21fY29sKGFlcyhmaWxsID0gaW5kaWNhdG9yX3Nob3J0KSkgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAtMSwgDQogICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IC44KSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEocmVhY2hlZCkpLCANCiAgICAgICAgICAgIGhqdXN0ID0gImlud2FyZCIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArIA0KICBsYWJzKHggPSBwYXN0ZTAoIlRvdGFsIHJlYWNoZWQgYXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJQZXJzb25zIHJlYWNoZWQgYnkgZWFjaCBFaUUgaW5kaWNhdG9yIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpIA0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQpgYGB7cn0NCmJlbl9wbG90IDwtIGZ1bmN0aW9uKHRibCkgew0KICB0YmwgJT4lIA0KICAgIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCwgY291bnR5KSAlPiUgDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0odG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICAgIGZ1bGxfam9pbih0YXJnZXRzICU+JSANCiAgICAgICAgICAgICAgICBmaWx0ZXIodGFyZ2V0X3VuaXQgJWluJSBjKCJwZW9wbGUiKSkgJT4lIA0KICAgICAgICAgICAgICAgIHNlbGVjdChjb3VudHksIGluZGljYXRvcl9zaG9ydCwgY291bnR5X3RhcmdldCksIA0KICAgICAgICAgICAgICBieSA9IGMoImNvdW50eSIsICJpbmRpY2F0b3Jfc2hvcnQiKSkgJT4lIA0KICAgIHJlcGxhY2VfbmEobGlzdChjb3VudHlfdGFyZ2V0ID0gMCwgDQogICAgICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSAwKSkgJT4lIA0KICAgIGZpbHRlcihiZW5lZmljaWFyaWVzID4gMCkgJT4lIA0KICAgIG11dGF0ZShwYyA9IGlmZWxzZShjb3VudHlfdGFyZ2V0ID4gMCwgYmVuZWZpY2lhcmllcyAvIGNvdW50eV90YXJnZXQsIDApLCANCiAgICAgICAgICAgY291bnR5ID0gZmN0X3Jlb3JkZXIoY291bnR5LCBiZW5lZmljaWFyaWVzKSkgJT4lICANCiAgICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCB5ID0gY291bnR5KSkgKyANCiAgICBnZW9tX2NvbChhZXMoZmlsbCA9IHBjKSkgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShiZW5lZmljaWFyaWVzKSwgaGp1c3QgPSAiaW53YXJkIiksIA0KICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleTQ1IikgKyANCiAgICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlyZWN0aW9uID0gLTEsIG9wdGlvbiA9ICJtYWtvIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHBlcmNlbnQsIGJlZ2luID0gLjIpICsgDQogICAgbGFicyh0aXRsZSA9ICJCZW5lZmljaWFyaWVzIHJlYWNoZWQiLCANCiAgICAgICAgIHggPSAiQmVuZWZpY2lhcmllcyIsIA0KICAgICAgICAgeSA9ICIiLCANCiAgICAgICAgIGZpbGwgPSAiJSByZWFjaGVkIikgDQp9DQoNCnBjX3Bsb3QgPC0gZnVuY3Rpb24odGJsKSB7DQogIHRibCAlPiUgDQogICAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0LCBjb3VudHkpICU+JSANCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogICAgZnVsbF9qb2luKHRhcmdldHMgJT4lIA0KICAgICAgICAgICAgICAgIGZpbHRlcih0YXJnZXRfdW5pdCAlaW4lIGMoInBlb3BsZSIpKSAlPiUgDQogICAgICAgICAgICAgICAgc2VsZWN0KGNvdW50eSwgaW5kaWNhdG9yX3Nob3J0LCBjb3VudHlfdGFyZ2V0KSwgDQogICAgICAgICAgICAgIGJ5ID0gYygiY291bnR5IiwgImluZGljYXRvcl9zaG9ydCIpKSAlPiUgDQogICAgcmVwbGFjZV9uYShsaXN0KGNvdW50eV90YXJnZXQgPSAwLCANCiAgICAgICAgICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IDApKSAlPiUgDQogICAgZmlsdGVyKGJlbmVmaWNpYXJpZXMgPiAwKSAlPiUgDQogICAgbXV0YXRlKHBjID0gaWZlbHNlKGNvdW50eV90YXJnZXQgPiAwLCBiZW5lZmljaWFyaWVzIC8gY291bnR5X3RhcmdldCwgMCksIA0KICAgICAgICAgICBjb3VudHkgPSBmY3RfcmVvcmRlcihjb3VudHksIGJlbmVmaWNpYXJpZXMpKSAlPiUgIA0KICAgIGdncGxvdChhZXMoeCA9IHBjLCB5ID0gY291bnR5KSkgKyANCiAgICBnZW9tX2NvbChhZXMoZmlsbCA9IHBjKSkgKyANCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGVyY2VudChwYywgYWNjdXJhY3kgPSAuMSksIGhqdXN0ID0gImlud2FyZCIpLCANCiAgICAgICAgICAgICAgY29sb3VyID0gImdyZXk0NSIpICsgDQogICAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnQpICsNCiAgICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlyZWN0aW9uID0gLTEsIG9wdGlvbiA9ICJtYWtvIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHBlcmNlbnQsIGJlZ2luID0gLjIpICsgDQogICAgbGFicyh0aXRsZSA9ICIlIG9mIHRhcmdldCByZWFjaGVkIiwgDQogICAgICAgICB4ID0gIiUgcmVhY2hlZCIsIA0KICAgICAgICAgeSA9ICIiLCANCiAgICAgICAgIGZpbGwgPSAiJSByZWFjaGVkIikgKw0KICAgIA0KICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCn0NCmBgYA0KDQpgYGB7cn0NCnRhcmdldHNfcmFuZ2UgPC0gdGFyZ2V0cyAlPiUgDQogIGZpbHRlcih0YXJnZXRfdW5pdCA9PSAicGVvcGxlIikgJT4lIA0KICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQsIGNvdW50eSkgJT4lIA0KICBzdW1tYXJpc2UodGFyZ2V0ID0gc3VtKGNvdW50eV90YXJnZXQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGluZGljYXRvcl9zaG9ydCwgdmFsdWVzX2Zyb20gPSB0YXJnZXQpICU+JSANCiAgc2V0TmFtZXMoYygiY291bnR5IiwgImluZGljYXRvcjEiLCAiaW5kaWNhdG9yMiIsICJpbmRpY2F0b3IzIiwgImluZGljYXRvcjQiLCANCiAgICAgICAgICAgICAiaW5kaWNhdG9yNSIsICJpbmRpY2F0b3I2IikpICU+JSANCiAgbXV0YXRlKGluZGljYXRvcjcgPSAwKQ0KDQppbmRpY2F0b3JfbWFwIDwtIGZ1bmN0aW9uKHRibCwgaW5kaWNhdG9yX251bWJlciwgcGxvdF9vcHRpb24pIHsNCiAgDQogIHBsb3Rfb3B0aW9uIDwtIGVucXVvKHBsb3Rfb3B0aW9uKQ0KICBpbmRpY2F0b3JfbnVtYmVyIDwtIGVucXVvKGluZGljYXRvcl9udW1iZXIpDQogIA0KICB0YmwgJT4lIA0KICAgIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgISFpbmRpY2F0b3JfbnVtYmVyKSkgJT4lIA0KICAgIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCwgY291bnR5KSAlPiUgDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0odG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICAgIGZ1bGxfam9pbih0YXJnZXRzICU+JSANCiAgICAgICAgICAgICAgICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICEhaW5kaWNhdG9yX251bWJlcikpICU+JQ0KICAgICAgICAgICAgICAgIGZpbHRlcih0YXJnZXRfdW5pdCAlaW4lIGMoInBlb3BsZSIpKSAlPiUgDQogICAgICAgICAgICAgICAgc2VsZWN0KGNvdW50eSwgaW5kaWNhdG9yX3Nob3J0LCBjb3VudHlfdGFyZ2V0KSwgDQogICAgICAgICAgICAgIGJ5ID0gYygiY291bnR5IiwgImluZGljYXRvcl9zaG9ydCIpKSAlPiUgDQogICAgcmVwbGFjZV9uYShsaXN0KGNvdW50eV90YXJnZXQgPSAwLCANCiAgICAgICAgICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IDApKSAlPiUgDQogICAgZmlsdGVyKGJlbmVmaWNpYXJpZXMgPiAwIHwgY291bnR5X3RhcmdldCA+IDApICAlPiUgDQogICAgbXV0YXRlKHBjID0gaWZlbHNlKGNvdW50eV90YXJnZXQgPiAwLCBiZW5lZmljaWFyaWVzIC8gY291bnR5X3RhcmdldCwgMCksIA0KICAgICAgICAgICBjb3VudHkgPSBmY3RfcmVvcmRlcihjb3VudHksIGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgbmFuaWFyOjpyZXBsYWNlX3dpdGhfbmEobGlzdChiZW5lZmljaWFyaWVzID0gMCkpICU+JSANCiAgICBsZWZ0X2pvaW4obG9jYXRpb25zICU+JSANCiAgICAgICAgICAgICAgICBkaXN0aW5jdChjb3VudHkgPSBhZG0xX2VuLCBhZG0xX3Bjb2RlKSwgDQogICAgICAgICAgICAgIGJ5ID0gImNvdW50eSIpICU+JSANCiAgICByaWdodF9qb2luKHBjb2RlMV9zaGFwZSwgYnkgPSBjKCJhZG0xX3Bjb2RlIikpICU+JQ0KICAgIHN0X2FzX3NmKCkgJT4lIA0KICAgIGdncGxvdCgpICsgDQogICAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgICBhZXMoZmlsbCA9ICEhcGxvdF9vcHRpb24pKSArIA0KICAgIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBjb21tYSghIXBsb3Rfb3B0aW9uKSksDQogICAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiLA0KICAgICAgICAgICAgICAgICBzaXplID0gMi41KSArIA0KICAgIHNjYWxlX2ZpbGxfdmlyaWRpc19jKGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiKSArIA0KICAgIHRoZW1lX3ZvaWQoKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSkpDQogICAgDQp9DQoNCmBgYA0KDQojIyMgMi4yLjEgQWNjZXNzIHRvIEVDRCBzcGFjZXMvc2Nob29scw0KDQo8YnI+DQoNCmBgYHtyfQ0Kc3VtbWFyeV90YWJsZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KEluZGljYXRvciwgIjEiKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKHBhc3RlMCgiRWlFIEluZGljYXRvciAxLCBhcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpDQoNCmBgYA0KDQo8YnI+DQoNCmBgYHtyfQ0KaW5kaWNhdG9yX21hcChlaWUsICIxIiwgY291bnR5X3RhcmdldCkgKw0KICBsYWJzKHRpdGxlID0gIlRhcmdldHMiLCANCiAgICAgICBmaWxsID0gIlRhcmdldCIpICArIA0KaW5kaWNhdG9yX21hcChlaWUsICIxIiwgYmVuZWZpY2lhcmllcykgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzKGxpbWl0cyA9IHJhbmdlKHRhcmdldHNfcmFuZ2UkaW5kaWNhdG9yMSksIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIikgKyANCiAgbGFicyh0aXRsZSA9ICJUb3RhbCByZWFjaGVkIiwgDQogICAgICAgZmlsbCA9ICJSZWFjaGVkIikgKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiMS4gQWNjZXNzIHRvIEVDRCBzcGFjZXMvc2Nob29scywgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiQXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgDQoNCmBgYA0KDQoNCg0KPGJyPg0KDQpJbiBgciBwYXJhbXMkcmVwb3J0X21vbnRoYCAyMDIzLCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjEiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyB3ZXJlIHJlYWNoZWQgYnkgaW50ZXJ2ZW50aW9ucyBjb250cmlidXRpbmcgdG8gdGhpcyBpbmRpY2F0b3IsIG9mIHdoaWNoIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMSIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJveXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGJveXMgYW5kIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMSIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGdpcmxzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBnaXJscy4NCg0KPGJyPg0KDQpgYGB7ciBmaWcuaGVpZ2h0PTZ9DQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxIikpICU+JSANCiAgcGNfcGxvdCgpICsNCg0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMSIpKSAlPiUgDQogIGJlbl9wbG90KCkgKw0KICANCnBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICIxLiBDaGlsZHJlbiBhY2Nlc3NpbmcgRUNEIHNwYWNlcy9zY2hvb2xzLCB0YXJnZXQgYW5kIHJlYWNoZWQiLCANCiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJDb3VudGllcyB3aXRob3V0IHRhcmdldHMgaGF2ZSAwJSByZWFjaGVkIikNCg0KIA0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyMgMi4yLjIgU2Nob29sIGZlZWRpbmcgcHJvZ3JhbW1lcw0KDQo8YnI+DQoNCmBgYHtyfQ0Kc3VtbWFyeV90YWJsZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KEluZGljYXRvciwgIjIiKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKHBhc3RlMCgiRWlFIEluZGljYXRvciAyLCBhcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpIA0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQppbmRpY2F0b3JfbWFwKGVpZSwgIjIiLCBjb3VudHlfdGFyZ2V0KSArDQogIGxhYnModGl0bGUgPSAiVGFyZ2V0cyIsIA0KICAgICAgIGZpbGwgPSAiVGFyZ2V0IikgICsgDQppbmRpY2F0b3JfbWFwKGVpZSwgIjIiLCBiZW5lZmljaWFyaWVzKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGltaXRzID0gcmFuZ2UodGFyZ2V0c19yYW5nZSRpbmRpY2F0b3IyKSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiKSArIA0KICBsYWJzKHRpdGxlID0gIlRvdGFsIHJlYWNoZWQiLCANCiAgICAgICBmaWxsID0gIlJlYWNoZWQiKSArDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICIyLiBTY2hvb2wgZmVlZGluZyBwcm9ncmFtbWVzLCB0YXJnZXQgYW5kIHJlYWNoZWQiLCANCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJBcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSANCg0KICANCmBgYA0KDQo8YnI+DQoNCkluIGByIHBhcmFtcyRyZXBvcnRfbW9udGhgIDIwMjMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMiIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIHdlcmUgcmVhY2hlZCBieSBpbnRlcnZlbnRpb25zIGNvbnRyaWJ1dGluZyB0byB0aGlzIGluZGljYXRvciwgb2Ygd2hpY2ggYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYm95cywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgYm95cyBhbmQgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kZ2lybHMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGdpcmxzLiANCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjIiKSkgJT4lIA0KICBwY19wbG90KCkgKw0KDQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyIikpICU+JSANCiAgYmVuX3Bsb3QoKSArDQogIA0KcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjIuIEZlZWRpbmcgcHJvZ3JhbW1lcyIsIA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gIkNvdW50aWVzIHdpdGhvdXQgdGFyZ2V0cyBoYXZlIDAlIHJlYWNoZWQiKQ0KDQoNCmBgYA0KDQoNCjxicj48YnI+PGJyPg0KDQojIyMgMi4yLjMgVGVhY2hpbmcgYW5kIGxlYXJuaW5nIG1hdGVyaWFscw0KDQo8YnI+DQoNCmBgYHtyfQ0Kc3VtbWFyeV90YWJsZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KEluZGljYXRvciwgIjMiKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKHBhc3RlMCgiRWlFIEluZGljYXRvciAzLCBhcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpIA0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQppbmRpY2F0b3JfbWFwKGVpZSwgIjMiLCBjb3VudHlfdGFyZ2V0KSArDQogIGxhYnModGl0bGUgPSAiVGFyZ2V0cyIsIA0KICAgICAgIGZpbGwgPSAiVGFyZ2V0IikgICsgDQppbmRpY2F0b3JfbWFwKGVpZSwgIjMiLCBiZW5lZmljaWFyaWVzKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGltaXRzID0gcmFuZ2UodGFyZ2V0c19yYW5nZSRpbmRpY2F0b3IzKSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiKSArIA0KICBsYWJzKHRpdGxlID0gIlRvdGFsIHJlYWNoZWQiLCANCiAgICAgICBmaWxsID0gIlJlYWNoZWQiKSArDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICIzLiBUZWFjaGluZyBhbmQgbGVhcm5pbmcgbWF0ZXJpYWxzLCB0YXJnZXQgYW5kIHJlYWNoZWQiLCANCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJBcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSANCg0KICANCmBgYA0KDQo8YnI+DQoNCkluIGByIHBhcmFtcyRyZXBvcnRfbW9udGhgIDIwMjMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMyIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIHdlcmUgcmVhY2hlZCBieSBpbnRlcnZlbnRpb25zIGNvbnRyaWJ1dGluZyB0byB0aGlzIGluZGljYXRvciwgb2Ygd2hpY2ggYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIzIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYm95cywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgYm95cywgIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMyIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGdpcmxzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBnaXJscywgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIzIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kbWVuLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBtZW4gYW5kIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMyIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHdvbWVuLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSB3b21lbi4gDQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIzIikpICU+JSANCiAgcGNfcGxvdCgpICsNCg0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMyIpKSAlPiUgDQogIGJlbl9wbG90KCkgKw0KICANCnBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICIzLiBUZWFjaGluZyBtYXRlcmlhbHMiLCANCiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJDb3VudGllcyB3aXRob3V0IHRhcmdldHMgaGF2ZSAwJSByZWFjaGVkIikNCg0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIyAyLjIuNCBTYWZlIHdhdGVyLCBwZXJzb25hbCBoeWdpZW5lDQoNCjxicj4NCg0KYGBge3J9DQpzdW1tYXJ5X3RhYmxlICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoSW5kaWNhdG9yLCAiNCIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24ocGFzdGUwKCJFaUUgSW5kaWNhdG9yIDQsIGFzIG9mICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSkpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45OSkgDQpgYGANCg0KPGJyPg0KDQpgYGB7cn0NCmluZGljYXRvcl9tYXAoZWllLCAiNCIsIGNvdW50eV90YXJnZXQpICsNCiAgbGFicyh0aXRsZSA9ICJUYXJnZXRzIiwgDQogICAgICAgZmlsbCA9ICJUYXJnZXQiKSAgKyANCmluZGljYXRvcl9tYXAoZWllLCAiNCIsIGJlbmVmaWNpYXJpZXMpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhsaW1pdHMgPSByYW5nZSh0YXJnZXRzX3JhbmdlJGluZGljYXRvcjQpLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIpICsgDQogIGxhYnModGl0bGUgPSAiVG90YWwgcmVhY2hlZCIsIA0KICAgICAgIGZpbGwgPSAiUmVhY2hlZCIpICsNCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjQuIFNhZmUgd2F0ZXIsIHBlcnNvbmFsIGh5Z2llbmUsIHRhcmdldCBhbmQgcmVhY2hlZCIsIA0KICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoIkFzIG9mICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSkpIA0KDQogIA0KYGBgDQoNCjxicj4NCg0KSW4gYHIgcGFyYW1zJHJlcG9ydF9tb250aGAgMjAyMywgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI0IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kdG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgd2VyZSByZWFjaGVkIGJ5IGludGVydmVudGlvbnMgY29udHJpYnV0aW5nIHRvIHRoaXMgaW5kaWNhdG9yLCBvZiB3aGljaCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjQiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRib3lzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBib3lzIGFuZCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjQiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRnaXJscywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGFuZCB3ZXJlIGdpcmxzLiANCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjQiKSkgJT4lIA0KICBwY19wbG90KCkgKw0KDQplaWUgJT4lDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjQiKSkgJT4lIA0KICBiZW5fcGxvdCgpICsNCiAgDQpwbG90X2Fubm90YXRpb24odGl0bGUgPSAiNC4gU2FmZSB3YXRlciwgcGVyc29uYWwgaHlnaWVuZSIsIA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gIkNvdW50aWVzIHdpdGhvdXQgJSByZWFjaGVkIGhhdmUgbm8gdGFyZ2V0IikNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyMgMi4yLjUgRWR1Y2F0b3JzIHRyYWluZWQgaW4gcmVzaWxpZW5jZSBlbmhhbmNpbmcgcHJvZ3JhbW1lcw0KDQo8YnI+DQoNCmBgYHtyfQ0Kc3VtbWFyeV90YWJsZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KEluZGljYXRvciwgIjUiKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKHBhc3RlMCgiRWlFIEluZGljYXRvciA1LCBhcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpIA0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQppbmRpY2F0b3JfbWFwKGVpZSwgIjUiLCBjb3VudHlfdGFyZ2V0KSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG5hLnZhbHVlID0gImdyZXk4MCIsIGxpbWl0cyA9IHJhbmdlKGMoMCwgMTgxMykpKSArIA0KICBsYWJzKHRpdGxlID0gIlRhcmdldHMiLCANCiAgICAgICBmaWxsID0gIlRhcmdldCIpICArIA0KaW5kaWNhdG9yX21hcChlaWUsICI1IiwgYmVuZWZpY2lhcmllcykgKyANCiAgbGFicyh0aXRsZSA9ICJUb3RhbCByZWFjaGVkIiwgDQogICAgICAgZmlsbCA9ICJSZWFjaGVkIikgKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiNS4gRWR1Y2F0b3JzIHRyYWluZWQgaW4gcmVzaWxpZW5jZSBlbmhhbmNpbmcgcHJvZ3JhbW1lcywgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiQXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgDQoNCmBgYA0KDQo8YnI+DQoNCkluIGByIHBhcmFtcyRyZXBvcnRfbW9udGhgIDIwMjMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIHdlcmUgcmVhY2hlZCBieSBpbnRlcnZlbnRpb25zIGNvbnRyaWJ1dGluZyB0byB0aGlzIGluZGljYXRvciwgb2Ygd2hpY2ggYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI1IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kbWVuLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBtZW4gYW5kIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHdvbWVuLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgYW5kIHdlcmUgd29tZW4uIA0KDQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI1IikpICU+JSANCiAgcGNfcGxvdCgpICsNCg0KZWllICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI1IikpICU+JSANCiAgYmVuX3Bsb3QoKSArDQogIA0KcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjUuIEVkdWNhdG9ycyB0cmFpbmVkIGluIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMiLCANCiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJDb3VudGllcyB3aXRob3V0ICUgcmVhY2hlZCBoYXZlIG5vIHRhcmdldCIpDQoNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyMgMi4yLjYgQ2hpbGRyZW4gYmVuZWZpdGVkIGZyb20gcmVzaWxpZW5jZSBlbmhhbmNpbmcgcHJvZ3JhbW1lcw0KDQo8YnI+DQoNCmBgYHtyfQ0Kc3VtbWFyeV90YWJsZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KEluZGljYXRvciwgIjYiKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKHBhc3RlMCgiRWlFIEluZGljYXRvciA2LCBhcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpIA0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQppbmRpY2F0b3JfbWFwKGVpZSwgIjYiLCBjb3VudHlfdGFyZ2V0KSArDQogIGxhYnModGl0bGUgPSAiVGFyZ2V0cyIsIA0KICAgICAgIGZpbGwgPSAiVGFyZ2V0IikgICsgDQppbmRpY2F0b3JfbWFwKGVpZSwgIjYiLCBiZW5lZmljaWFyaWVzKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGltaXRzID0gcmFuZ2UodGFyZ2V0c19yYW5nZSRpbmRpY2F0b3I2KSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiKSArIA0KICBsYWJzKHRpdGxlID0gIlRvdGFsIHJlYWNoZWQiLCANCiAgICAgICBmaWxsID0gIlJlYWNoZWQiKSArDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICI2LiBDaGlsZHJlbiBiZW5lZml0ZWQgZnJvbSByZXNpbGllbmNlIGVuaGFuY2luZyBwcm9ncmFtbWVzLCB0YXJnZXQgYW5kIHJlYWNoZWQiLCANCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJBcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSANCg0KYGBgDQoNCjxicj4NCg0KSW4gYHIgcGFyYW1zJHJlcG9ydF9tb250aGAgMjAyMywgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI2IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kdG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgd2VyZSByZWFjaGVkIGJ5IGludGVydmVudGlvbnMgY29udHJpYnV0aW5nIHRvIHRoaXMgaW5kaWNhdG9yLCBvZiB3aGljaCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjYiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRib3lzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBib3lzIGFuZCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjYiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRnaXJscywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGFuZCB3ZXJlIGdpcmxzIA0KDQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI2IikpICU+JSANCiAgcGNfcGxvdCgpICsNCg0KZWllICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI2IikpICU+JSANCiAgYmVuX3Bsb3QoKSArDQogIA0KcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjYuIENoaWxkcmVuIGJlbmVmaXRlZCBmcm9tIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMiLCANCiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJDb3VudGllcyB3aXRob3V0ICUgcmVhY2hlZCBoYXZlIG5vIHRhcmdldCIpDQoNCg0KYGBgDQoNCg0KPGJyPjxicj48YnI+DQoNCiMjIyAyLjIuNyBDaGlsZHJlbiBiZW5lZml0ZWQgZnJvbSBjb25zdHJ1Y3Rpb24gYW5kIHJlaGFiaWxpdGF0aW9uDQoNCjxicj4NCg0KYGBge3J9DQpzdW1tYXJ5X3RhYmxlICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoSW5kaWNhdG9yLCAiNyIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24ocGFzdGUwKCJFaUUgSW5kaWNhdG9yIDcsIGFzIG9mICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSkpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45OSkgDQpgYGANCg0KDQo8YnI+DQoNClRvIG5vdGU6IHRhcmdldHMgaGF2ZSBub3QgYmVlbiBzZXQgZm9yIGluZGljYXRvciA3Lg0KDQo8YnI+DQoNCmBgYHtyfQ0KaW5kaWNhdG9yX21hcChlaWUsICI3IiwgY291bnR5X3RhcmdldCkgKw0KICBsYWJzKHRpdGxlID0gIlRhcmdldHMiLCANCiAgICAgICBmaWxsID0gIlRhcmdldCIpICArIA0KaW5kaWNhdG9yX21hcChlaWUsICI3IiwgYmVuZWZpY2lhcmllcykgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzKGxpbWl0cyA9IHJhbmdlKHRhcmdldHNfcmFuZ2UkaW5kaWNhdG9yNiksIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIikgKyANCiAgbGFicyh0aXRsZSA9ICJUb3RhbCByZWFjaGVkIiwgDQogICAgICAgZmlsbCA9ICJSZWFjaGVkIikgKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiNy4gQ2hpbGRyZW4gYmVuZWZpdGVkIGZyb20gcmVzaWxpZW5jZSBlbmhhbmNpbmcgcHJvZ3JhbW1lcywgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiQXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgDQoNCmBgYA0KDQo8YnI+DQoNCkluIGByIHBhcmFtcyRyZXBvcnRfbW9udGhgIDIwMjMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNyIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIHdlcmUgcmVhY2hlZCBieSBpbnRlcnZlbnRpb25zIGNvbnRyaWJ1dGluZyB0byB0aGlzIGluZGljYXRvciwgb2Ygd2hpY2ggYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI3IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYm95cywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgYm95cyBhbmQgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI3IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kZ2lybHMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBhbmQgd2VyZSBnaXJscyANCg0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNyIpKSAlPiUgDQogIHBjX3Bsb3QoKSArDQoNCmVpZSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNyIpKSAlPiUgDQogIGJlbl9wbG90KCkgKw0KICANCnBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICI3LiBDaGlsZHJlbiBiZW5lZml0ZWQgZnJvbSByZXNpbGllbmNlIGVuaGFuY2luZyBwcm9ncmFtbWVzIiwgDQogICAgICAgICAgICAgICAgc3VidGl0bGUgPSAiTm8gdGFyZ2V0cyBzZXQgZm9yIGluZGljYXRvciA3IikNCg0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMgMy4gUGFydG5lcnMNCg0KIyMgMy4xIE9wZXJhdGlvbmFsIHByZXNlbmNlIG9mIGltcGxlbWVudGluZyBwYXJ0bmVycw0KDQo8YnI+DQoNCg0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0PTd9DQoNCnBhcnRuZXJfbWFwIDwtIGVpZSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGJveXMsIGdpcmxzLCBtZW4sIHdvbWVuKSwgfiByZXBsYWNlX25hKC4sIDApKSAlPiUgDQogIGdyb3VwX2J5KGFkbTFfcGNvZGUsIGNvdW50eSkgJT4lIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSwgDQogICAgICAgICAgICBsZWFkX29yZ2FuaXNhdGlvbiA9IG5fZGlzdGluY3QobGVhZF9vcmdhbmlzYXRpb24pLA0KICAgICAgICAgICAgYWN0aXZpdGllcyA9IG5fZGlzdGluY3QoaW5kaWNhdG9yX3Nob3J0KSwgDQogICAgICAgICAgICB3b21lbiA9IHN1bSh3b21lblthY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgbWVuID0gc3VtKG1lblthY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGJveXMgPSBzdW0oYm95c1thY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGdpcmxzID0gc3VtKGdpcmxzW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICB0b3RhbF9yZWFjaGVkID0gc3VtKHRvdGFsX3JlYWNoZWRbYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgbXV0YXRlKHJlYWNoZWQgPSBtZW4gKyB3b21lbiArIGJveXMgKyBnaXJscywgDQogICAgICAgICBtYWxlID0gbWVuICsgYm95cywgDQogICAgICAgICBmZW1hbGUgPSB3b21lbiArIGdpcmxzLCANCiAgICAgICAgIG1hbGVfcGMgPSByb3VuZChtYWxlIC8gcmVhY2hlZCAqIDEwMCksIA0KICAgICAgICAgZmVtYWxlX3BjID0gcm91bmQoZmVtYWxlIC8gcmVhY2hlZCAqIDEwMCkpICU+JSAgDQogIGxlZnRfam9pbihwYXJ0bmVyX2xpc3RfY291bnRpZXMgJT4lDQogICAgICAgICAgICAgIGRpc3RpbmN0KGFkbTFfcGNvZGUsIGFjcm9ueW0pICU+JQ0KICAgICAgICAgICAgICBncm91cF9ieShhZG0xX3Bjb2RlKSAlPiUNCiAgICAgICAgICAgICAgYXJyYW5nZShhY3JvbnltKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShhY3JvbnltID0gcGFzdGUwKGFjcm9ueW0sIGNvbGxhcHNlID0gIiwgIikpICU+JQ0KICAgICAgICAgICAgICBtdXRhdGUoYWNyb255bSA9IHN0cl9yZXBsYWNlX2FsbChhY3JvbnltLCAiQ2hpbGRGdW5kIiwgIkNGIiksIA0KICAgICAgICAgICAgICAgICAgICAgbl9wYXJ0bmVycyA9IHN0cl9jb3VudChhY3JvbnltLCAiLCIpICsgMSksIA0KICAgICAgICAgICAgYnkgPSAiYWRtMV9wY29kZSIpICU+JSANCiAgbGVmdF9qb2luKHBjb2RlMV9zaGFwZSwgDQogICAgICAgICAgICAgYnkgPSAiYWRtMV9wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsgDQogIGdlb21fc2Yoc2l6ZSA9IC4wMSwgY29sb3VyID0gImdyZXk3MCIsIA0KICAgICAgICAgIGRhdGEgPSBwY29kZTFfc2hhcGUpICsgDQogIGdlb21fc2Yoc2l6ZSA9IC4wMSwgY29sb3VyID0gImdyZXk3MCIsIA0KICAgICAgICAgIGFlcyhmaWxsID0gcGFydG5lcnMsIA0KICAgICAgICAgICAgICBjb2xvdXIgPSBhZG0xX3Bjb2RlKSkgKyANCiAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMCggDQogICAgY291bnR5LCAiXG4iLCBwYXJ0bmVycyksIA0KICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoDQogICAgICAgICAgICAgICAgIkNvdW50eTogIiwgY291bnR5LCAiXG4iLCANCiAgICAgICAgICAgICAgICAiUGFydG5lcnM6ICIsIG5fcGFydG5lcnMsICJcbiIsIA0KICAgICAgICAgICAgICAgICJSZWFjaGVkOiAiLCBjb21tYSh0b3RhbF9yZWFjaGVkKSwgIlxuIiwgDQogICAgICAgICAgICAgICAgIkZlbWFsZV9yZWFjaGVkJTogIiwgZmVtYWxlX3BjLCAiJSwgIiwgIk1hbGVfcmVhY2hlZCU6ICIsIG1hbGVfcGMsICIlIiwgDQogICAgICAgICAgICAgICAgIlxuIiwgIA0KICAgICAgICAgICAgICAgIGFjcm9ueW0pKSwgDQogICAgICAgICAgICAgICAgc2l6ZSA9IDMsIGNvbG91ciA9ICJncmF5NDAiKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAibWFrbyIsIA0KICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEsDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDEsIDMsIDYsIDEwKSkgKyANCiAgDQogIHRoZW1lX3ZvaWQoKSArIA0KICAjIFJlbWVtYmVyIHRoYXQgeW91IG5lZWQgZ3VpZGVfY29sb3JiYXIsIG5vdCBndWlkZV9sZWdlbmQNCiAgIyBndWlkZXMoZmlsbCA9IGd1aWRlX2NvbG9yYmFyKHJldmVyc2UgPSBUUlVFKSkgKyANCiAgbGFicyh0aXRsZSA9ICJLRU5ZQTogRWR1Y2F0aW9uIGluIEVtZXJnZW5jaWVzIFdvcmtpbmcgR3JvdXAgb3BlcmF0aW9uYWwgcHJlc2VuY2UiLCANCiAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiYXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSwgDQogICAgICAgZmlsbCA9ICJQYXJ0bmVycyIpDQoNCg0KZ2dwbG90bHkocGFydG5lcl9tYXAsIHRvb2x0aXAgPSBjKCJ0ZXh0IikpICU+JSANCiAgbGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gcGFzdGUwKHN1bV9zdGF0cyRwYXJ0bmVycywgIiBFaUUgaW1wbGVtZW50aW5nIHBhcnRuZXJzIGFjcm9zcyAiLCBzdW1fc3RhdHMkY291bnRpZXMsICIgY291bnRpZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUsICI7IG1vdXNlIG92ZXIgY291bnR5IG5hbWUgZm9yIG1vcmUgZGV0YWlscyIsICI8L3N1cD4iKSkpDQpgYGANCg0KDQo8YnI+DQoNCg0KQmVsb3cgaXMgYW4gaW50ZXJhY3RpdmUgdGFibGUgd2hpY2ggYWRkcyBkZXRhaWwgdG8gdGhlIG1hcCBhYm92ZSwgc2VydmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciBjb29yZGluYXRpb24gLS0gYWxsb3dpbmcgaW50ZXJlc3RlZCBwYXJ0aWVzIHRvIHNlYXJjaCBieSBjb3VudHkgb3IgcGFydG5lci4gDQoNCiBUaGUgY29sdW1uIGAjQWN0aXZpdGllc2AgcmVmZXJzIHRvIHRoZSBudW1iZXIgb2YgRWR1Y2F0aW9uIGFjdGl2aXRpZXMgaW1wbGVtZW50ZWQgYnkgc2FpZCBwYXJ0bmVyIGluIGVhY2ggY291bnR5LiBFYWNoIGNvbHVtbiBjYW4gYmUgc29ydGVkIHdpdGggdGhlIGFycm93cyBuZXh0IHRvIGVhY2ggY29sdW1uIG5hbWUuIEVhY2ggY29sdW1uIGNhbiBhbHNvIGJlIGZpbHRlcmVkIGJ5IHR5cGluZyBpbnRvIHRoZSBzZWFyY2ggYmFyIGJlbG93IGVhY2ggY29sdW1uIG5hbWUuIE9ubHkgY29tcGxldGVkIGFjdGl2aXRpZXMgaGF2ZSBiZWVuIGluY2x1ZGVkLg0KIA0KYGBge3J9DQplaWUgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGltcGxlbWVudGluZ19wYXJ0bmVyLCBsZWFkX29yZ2FuaXNhdGlvbiksIH4gDQogICAgICAgICAgICAgIHN0cl9zdWIoLiwgZW5kID0gNTBMKSkgJT4lICANCiAgZ3JvdXBfYnkoY291bnR5LCBhZG0xX3Bjb2RlLCBpbXBsZW1lbnRpbmdfcGFydG5lciwgbGVhZF9vcmdhbmlzYXRpb24pICU+JSANCiAgc3VtbWFyaXNlKHJlYWNoZWQgPSBzdW0odG90YWxfcmVhY2hlZFthY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGFjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGluZGljYXRvcl9zaG9ydCkpICU+JSANCiAgc2VsZWN0KGNvdW50eSwgaW1wbGVtZW50aW5nX3BhcnRuZXIsIGxlYWRfb3JnYW5pc2F0aW9uLCByZWFjaGVkLCBgI2FjdGl2aXRpZXNgID0gYWN0aXZpdGllcywgYWRtMV9wY29kZSkgJT4lIA0KICB3cml0ZV9jc3YoIi4vZGF0YS9icmVha2Rvd25fYnlfY291bnR5X3BhcnRuZXIuY3N2IikNCmBgYA0KIA0KDQpEb3dubG9hZCB0aGUgZGF0YXNldCBmcm9tIHRoZSB0YWJsZSBiZWxvdyBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL2tlbnlhLWVpZS13Zy9laWVfd2dfNXdzL2Jsb2IvbWFpbi9kYXRhL2JyZWFrZG93bl9ieV9jb3VudHlfcGFydG5lci5jc3YpLiANCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoaW1wbGVtZW50aW5nX3BhcnRuZXIsIGxlYWRfb3JnYW5pc2F0aW9uKSwgfiANCiAgICAgICAgICAgICAgc3RyX3N1YiguLCBlbmQgPSA1MEwpKSAlPiUgIA0KICBncm91cF9ieShjb3VudHksIGFkbTFfcGNvZGUsIGltcGxlbWVudGluZ19wYXJ0bmVyLCBsZWFkX29yZ2FuaXNhdGlvbikgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgYWN0aXZpdGllcyA9IG5fZGlzdGluY3QoaW5kaWNhdG9yX3Nob3J0KSkgJT4lIA0KICBsZWZ0X2pvaW4ocGFydG5lcl9saXN0X2NvdW50aWVzICU+JSANCiAgICAgICAgICAgICAgZGlzdGluY3QocGFydG5lciwgYWNyb255bSksIA0KICAgICAgICAgICAgYnkgPSBjKCJpbXBsZW1lbnRpbmdfcGFydG5lciIgPSAicGFydG5lciIpKSAlPiUgDQogIHNlbGVjdChjb3VudHksIGxlYWRfb3JnYW5pc2F0aW9uLCBpbXBsZW1lbnRpbmdfcGFydG5lciwgYWNyb255bSwgcmVhY2hlZCwgYCNhY3Rpdml0aWVzYCA9IGFjdGl2aXRpZXMsIGFkbTFfcGNvZGUpICU+JSANCiAgc2VsZWN0X2FsbCguLCB+IHN0cl90b190aXRsZSguKSkgJT4lIA0KICBkYXRhdGFibGUob3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBzY3JvbGxYID0gVFJVRSksIA0KICAgICAgICAgICAgZmlsdGVyID0gbGlzdChwb3NpdGlvbiA9ICJ0b3AiLCBjbGVhciA9IEZBTFNFKSwNCiAgICAgICAgICAgIGNhcHRpb24gPSBodG1sdG9vbHM6OnRhZ3MkY2FwdGlvbihzdHlsZSA9ICdjYXB0aW9uLXNpZGU6IHRvcDsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZToxMjAlIDsnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJyZWFrZG93biBieSBjb3VudHkgYW5kIHBhcnRuZXIiKSkgJT4lIA0KICBmb3JtYXRTdHlsZSgwLCB0YXJnZXQgPSAicm93IiwgbGluZUhlaWdodCA9ICI4MCUiLCBmb250U2l6ZSA9ICI4MCUiKSAlPiUgDQogIGZvcm1hdEN1cnJlbmN5KGMoIlJlYWNoZWQiKSwgDQogICAgICAgICAgICAgICAgIGN1cnJlbmN5ID0gIiIsIGludGVydmFsID0gMywgbWFyayA9ICIsIikgJT4lIA0KICBmb3JtYXRSb3VuZChjKCJSZWFjaGVkIiksIGRpZ2l0cyA9IDApDQoNCmBgYA0KDQoNCjxicj48YnI+PGJyPg0KDQojIyAzLjIgU3VtbWFyeSBieSBpbXBsZW1lbnRpbmcgcGFydG5lcg0KDQoNClRoZSB0YWJsZSBiZWxvdyBicmVha3MgZG93biBwZXJzb25zIHJlYWNoZWQgYnkgcGFydG5lci4gDQoNCjxicj4NCg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgbXV0YXRlKGltcGxlbWVudGluZ19wYXJ0bmVyID0gc3RyX3N1YihpbXBsZW1lbnRpbmdfcGFydG5lciwgZW5kID0gNTBMKSkgJT4lIA0KICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcikgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGNvdW50aWVzID0gbl9kaXN0aW5jdChhZG0xX3Bjb2RlKSwgDQogICAgICAgICAgICBhY3Rpdml0aWVzID0gbl9kaXN0aW5jdChpbmRpY2F0b3Jfc2hvcnQpKSAlPiUgDQogIGZpbHRlcihyZWFjaGVkID4gMCkgJT4lIA0KICBtdXRhdGUoYCV0b3RhbGAgPSByb3VuZChyZWFjaGVkIC8gc3VtKHJlYWNoZWQpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MocmVhY2hlZCkpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X2NhcHRpb24oIlN1bW1hcnkgYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIiKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOSkgJT4lIA0KICBmb290bm90ZShpID0gMSwgaiA9IDIsIHJlZl9zeW1ib2xzID0gIjEiLCBwYXJ0ID0gImhlYWRlciIsDQogICAgICAgICAgIGFzX3BhcmFncmFwaCgiQWxsIGluZGljYXRvcnMgYXMgb3Bwb3NlZCBvbmx5IGluZGljYXRvcnMgMSwgMiwgNSBhbmQgNiIpKSAlPiUgDQogIGZvb3Rub3RlKGkgPSAxLCBqID0gNSwgcmVmX3N5bWJvbHMgPSAiMiIsIHBhcnQgPSAiaGVhZGVyIiwNCiAgICAgICAgICAgYXNfcGFyYWdyYXBoKCJQZXJjZW50YWdlIG9mIHJlYWNoZWQgZm9yIGFsbCBpbmRpY2F0b3JzIikpDQoNCg0KYGBgDQoNCg0KPGJyPjxicj48YnI+DQoNCiMjIDMuMyBTdW1tYXJ5IGJ5IGxlYWRfb3JnYW5pc2F0aW9uDQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBtdXRhdGUobGVhZF9vcmdhbmlzYXRpb24gPSBzdHJfc3ViKGxlYWRfb3JnYW5pc2F0aW9uLCBlbmQgPSA1MEwpKSAlPiUgDQogIGdyb3VwX2J5KGxlYWRfb3JnYW5pc2F0aW9uKSAlPiUgDQogIHN1bW1hcmlzZShyZWFjaGVkID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgY291bnRpZXMgPSBuX2Rpc3RpbmN0KGFkbTFfcGNvZGUpLCANCiAgICAgICAgICAgIGFjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGluZGljYXRvcl9zaG9ydCkpICU+JSANCiAgZmlsdGVyKHJlYWNoZWQgPiAwKSAlPiUgDQogIG11dGF0ZShgJXRvdGFsYCA9IHJvdW5kKHJlYWNoZWQgLyBzdW0ocmVhY2hlZCkgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhyZWFjaGVkKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiU3VtbWFyeSBieSBsZWFkIG9yZ2FuaXNhdGlvbiIpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45KSAlPiUgDQogIGZvb3Rub3RlKGkgPSAxLCBqID0gMiwgcmVmX3N5bWJvbHMgPSAiMSIsIHBhcnQgPSAiaGVhZGVyIiwNCiAgICAgICAgICAgYXNfcGFyYWdyYXBoKCJBbGwgaW5kaWNhdG9ycyBhcyBvcHBvc2VkIG9ubHkgaW5kaWNhdG9ycyAxLCAyLCA1IGFuZCA2IikpICU+JSANCiAgZm9vdG5vdGUoaSA9IDEsIGogPSA1LCByZWZfc3ltYm9scyA9ICIyIiwgcGFydCA9ICJoZWFkZXIiLA0KICAgICAgICAgICBhc19wYXJhZ3JhcGgoIlBlcmNlbnRhZ2Ugb2YgcmVhY2hlZCBmb3IgYWxsIGluZGljYXRvcnMiKSkNCiAgDQpgYGANCg0KDQoNCiMgNC4gU2Nob29scyBhbmQgZWR1Y2F0aW9uIGxldmVsDQoNCiMjIDQuMSBTY2hvb2xzDQoNClRoZSBudW1iZXIgb2Ygc2Nob29scyByZWFjaGVkIGJ5IHNjaG9vbCBmZWVkaW5nIHByb2dyYW1tZXMgYW5kIFdBU0ggaW4gc2Nob29scyBpbnRlcnZlbnRpb25zIHRvLWRhdGUgYXJlOiANCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgZmlsdGVyKCFpcy5uYShudW1iZXJfc2Nob29scykpICU+JQ0KICBtdXRhdGUoZGF0ZSA9IG5hbWVfdG9fZGF0ZShtb250aCkpICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMnw0IikpICU+JQ0KICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQsIGRhdGUpICU+JSANCiAgc3VtbWFyaXNlKHNjaG9vbHMgPSBzdW0obnVtYmVyX3NjaG9vbHMpLCANCiAgICAgICAgICAgIHJlYWNoZWQgPSBzdW0odG90YWxfcmVhY2hlZCkpICU+JSANCiAgYXJyYW5nZShkYXRlKSAlPiUgDQogIG11dGF0ZShjdW1fc2Nob29scyA9IGN1bXN1bShzY2hvb2xzKSkgJT4lIA0KICBhcnJhbmdlKGluZGljYXRvcl9zaG9ydCkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBkYXRlLCB5ID0gY3VtX3NjaG9vbHMpLCANCiAgICAgICAgIHZqdXN0ID0gLS41KSArIA0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSBtb250aCIsIGRhdGVfbGFiZWxzID0gIiViIikgKyANCiAgZ2VvbV9saW5lKHNpemUgPSAxLjcsIA0KICAgICAgICAgICAgYWVzKGNvbG91ciA9IGluZGljYXRvcl9zaG9ydCkpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShjdW1fc2Nob29scykpLCB2anVzdCA9IC0uNSkgKw0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIiMzMTY4OGUiLCAiI2Q4NTc2YiIpKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArIA0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICJDdW11bGF0aXZlIG51bWJlciBvZiBzY2hvb2xzIHJlYWNoZWQiLCANCiAgICAgICB0aXRsZSA9ICJTY2hvb2xzIHJlYWNoZWQgYnkgZmVlZGluZyBwcm9ncmFtbWVzIGFuZCBXQVNIIGluIHNjaG9vbHMiLCANCiAgICAgICBjb2xvdXIgPSAiSW5kaWNhdG9yIikNCg0KDQpgYGANCg0KPGJyPg0KDQpIb3dldmVyLCByZXBvcnRpbmcgdGhlIG92ZXJhbGwgbnVtYmVyIG9mIHNjaG9vbHMgcmVhY2hlZCBieSBhbGwgRWlFIGludGVydmVudGlvbnMgaXMgbXVjaCBtb3JlIGNoYWxsZW5naW5nLg0KDQpXaGlsc3QgYWxsIHBhcnRuZXJzIHdvcmtpbmcgb24gaW5kaWNhdG9ycyAyIGFuZCA0IHN1Ym1pdHRlZCB0aGUgbnVtYmVyIG9mIHNjaG9vbHMgdGhleSB3ZXJlIHdvcmtpbmcgaW4sIHRoZSBzYW1lIGlzIG5vdCB0cnVlIGZvciB0aGUgb3RoZXIgaW5kaWNhdG9ycy4gT25seSBpbmRpY2F0b3JzIDIgYW5kIDQgcmVxdWlyZSB0aGUgcmVwb3J0aW5nIG9mIHRoZSBudW1iZXIgb2Ygc2Nob29scy4gDQoNCg0KPGJyPjxicj48YnI+DQoNCg0KDQoNCg0KDQojIDUuIFJlZmVyZW5jZSBtYXBzIGFuZCB0YWJsZXMgDQoNCiMjIDUuMSBSZWZlcmVuY2UgbWFwcyANCg0KSVBDIGRhdGEgZXh0cmFjdGVkIGZyb20gW2hlcmVdKGh0dHBzOi8vd3d3LmlwY2luZm8ub3JnL2lwYy1jb3VudHJ5LWFuYWx5c2lzL2RldGFpbHMtbWFwL2VuL2MvMTE1NjU0MS8/aXNvMz1LRU4pLiANCg0KYGBge3IgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEwfQ0KaXBjICU+JSANCiAgcmlnaHRfam9pbihwY29kZTFfc2hhcGUsIA0KICAgICAgICAgICAgIGJ5ID0gImFkbTFfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICBhZXMoZmlsbCA9IG51bWJlcl9waGFzZV9wMykpICsgDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBjb21tYShudW1iZXJfcGhhc2VfcDMpKSwgDQogICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleTQ1IiwgDQogICAgICAgICAgICAgICBzaXplID0gMikgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MobGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gImluZmVybm8iLCBiZWdpbiA9IC40LCAsIGRpcmVjdGlvbiA9IC0xKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgbGFicyhmaWxsID0gIkF0IGxlYXN0XG5waGFzZSAzIiwgDQogICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIHBlcnNvbnMgSVBDIFBoYXNlIDMgb3IgYWJvdmUiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJTb3VyY2U6IGh0dHBzOi8vd3d3LmlwY2luZm8ub3JnLyIpICsgDQoNCmlwYyAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUxX3NoYXBlLCANCiAgICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgYWVzKGZpbGwgPSBwZXJjZW50X3BoYXNlX3AzKSkgKyANCiAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQocGVyY2VudF9waGFzZV9wMykpLCANCiAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiLCANCiAgICAgICAgICAgICAgIHNpemUgPSAyKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhsYWJlbHMgPSBwZXJjZW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJpbmZlcm5vIiwgYmVnaW4gPSAuNCwgLCBkaXJlY3Rpb24gPSAtMSkgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnMoZmlsbCA9ICIlIElQQyBwaGFzZSAzIiwgDQogICAgICAgdGl0bGUgPSAiUGVyY2VudGFnZSBvZiBwb3B1bGF0aW9uIElQQyBQaGFzZSAzIG9yIGFib3ZlIiwgDQogICAgICAgc3VidGl0bGUgPSAiU291cmNlOiBodHRwczovL3d3dy5pcGNpbmZvLm9yZy8iKSArDQoNCg0KZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieShhZG0xX3Bjb2RlKSAlPiUgDQogIHN1bW1hcmlzZShzZWN0b3JfcmVhY2hlZCA9IHN1bShzZWN0b3JfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBmaWx0ZXIoc2VjdG9yX3JlYWNoZWQgPiAwKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUxX3NoYXBlLCANCiAgICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgYWVzKGZpbGwgPSBzZWN0b3JfcmVhY2hlZCkpICsgDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBjb21tYShzZWN0b3JfcmVhY2hlZCkpLCANCiAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiLCANCiAgICAgICAgICAgICAgIHNpemUgPSAyKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJtYWtvIiwgDQogICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAtMSwgDQogICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IC4yLA0KICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nIiwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDAsIDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgMzM5NDgzKSkgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnMoZmlsbCA9ICJTZWN0b3JcbnJlYWNoZWQiLCANCiAgICAgICB0aXRsZSA9ICJQZXJzb25zIHJlYWNoZWQgYnkgdGhlIEVkdWNhdGlvbiBTZWN0b3IiKSArIA0KICANCmVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgZ3JvdXBfYnkoYWRtMV9wY29kZSkgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bShzZWN0b3JfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBmdWxsX2pvaW4odGFyZ2V0cyAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcih0YXJnZXRfdW5pdCA9PSAicGVvcGxlIikgJT4lDQogICAgICAgICAgICAgIGRpc3RpbmN0KGFkbTFfcGNvZGUsIHRhcmdldCA9IGNvdW50eV9vdmVyYWxsX3RhcmdldCkpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KHJlYWNoZWQgPSAwLCB0YXJnZXQgPSAwKSkgJT4lIA0KICBtdXRhdGUocGMgPSBpZmVsc2UodGFyZ2V0ID09IDAsIDAsIHJlYWNoZWQgLyB0YXJnZXQpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUxX3NoYXBlLCANCiAgICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKw0KICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICBhZXMoZmlsbCA9IHBjKSkgKyANCiAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQocGMsIGFjY3VyYWN5ID0gMSkpLCANCiAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiLCANCiAgICAgICAgICAgICAgIHNpemUgPSAyKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGFiZWxzID0gcGVyY2VudCwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIsDQogICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAibWFrbyIsIA0KICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEsDQogICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IC4yKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgbGFicyhmaWxsID0gIiUgb2YgdGFyZ2V0IiwgDQogICAgICAgdGl0bGUgPSAiUGVyY2VudGFnZSBvZiBFaUUgY291bnR5IHRhcmdldCByZWFjaGVkIikgKyAgIA0KDQpwbG90X2xheW91dChuY29sID0gMiwgDQogICAgICAgICAgICBucm93ID0gMikNCiAgDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCg0KIyMgNS4yIFJlZmVyZW5jZSB0YWJsZSANCg0KRG93bmxvYWQgdGhlIEVpRSA1V3MgZGF0YSBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL2tlbnlhLWVpZS13Zy9laWVfd2dfNXdzL2Jsb2IvbWFpbi9kYXRhL2VpZV81d3MuY3N2KQ0KDQpBcyBhIHJlZnJlc2hlciBmb3IgdGhlIHJlZmVyZW5jZSB0YWJsZSBiZWxvdywgdGhlIGluZGljYXRvcnMgYXJlOiANCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGRpc3RpbmN0KGluZGljYXRvcikgJT4lIA0KICBhcnJhbmdlKGluZGljYXRvcikgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyh3aWR0aCA9IC44NSwgbGF5b3V0ID0gImF1dG9maXQiKSAlPiUgDQogIGZvbnRzaXplKGkgPSAxOjYsIGogPSAxLCBzaXplID0gOSkgDQoNCmBgYA0KDQo8YnI+DQoNCg0KYGBge3J9DQplaWUgJT4lDQogIG11dGF0ZShpbXBsZW1lbnRpbmdfcGFydG5lciA9IHN0cl9zdWIoaW1wbGVtZW50aW5nX3BhcnRuZXIsIGVuZCA9IDUwTCksIA0KICAgICAgICAgaW5kaWNhdG9yX251bWJlciA9IHBhcnNlX251bWJlcihpbmRpY2F0b3Jfc2hvcnQpKSAlPiUNCiAgZ3JvdXBfYnkoY291bnR5LCBhZG0xX3Bjb2RlLCBpbXBsZW1lbnRpbmdfcGFydG5lciwgaW5kaWNhdG9yX251bWJlcikgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIHNlbGVjdChjb3VudHksIGltcGxlbWVudGluZ19wYXJ0bmVyLCBpbmRpY2F0b3IgPSBpbmRpY2F0b3JfbnVtYmVyLCByZWFjaGVkLCBhZG0xX3Bjb2RlKSAlPiUgDQogIGRhdGF0YWJsZShvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTAsIHNjcm9sbFggPSBUUlVFKSwgDQogICAgICAgICAgICBmaWx0ZXIgPSBsaXN0KHBvc2l0aW9uID0gInRvcCIsIGNsZWFyID0gRkFMU0UpLA0KICAgICAgICAgICAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKHN0eWxlID0gJ2NhcHRpb24tc2lkZTogdG9wOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOjEyMCUgOycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQnJlYWtkb3duIGJ5IGluZGljYXRvciwgY291bnR5IGFuZCBpbXBsZW1lbnRpbmcgcGFydG5lciIpKSAlPiUgDQogIGZvcm1hdFN0eWxlKDAsIHRhcmdldCA9ICJyb3ciLCBsaW5lSGVpZ2h0ID0gIjgwJSIsIGZvbnRTaXplID0gIjgwJSIpICU+JSANCiAgZm9ybWF0Q3VycmVuY3koYygicmVhY2hlZCIpLCANCiAgICAgICAgICAgICAgICAgY3VycmVuY3kgPSAiIiwgaW50ZXJ2YWwgPSAzLCBtYXJrID0gIiwiKSAlPiUgDQogIGZvcm1hdFJvdW5kKGMoInJlYWNoZWQiKSwgZGlnaXRzID0gMCkNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KDQoNCg0KDQoNCg0KDQoNCg0K